package main.old.new_2023.last.month_8;


import java.util.ArrayDeque;

/**
 * @Description: todo 1572. 矩阵对角线元素的和
 * 给你一个正方形矩阵 mat，请你返回矩阵对角线元素的和。
 * 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。
 *
 * todo 1499. 满足不等式的最大值
 * 给你一个数组 points 和一个整数 k 。数组中每个元素都表示二维平面上的点的坐标，并按照横坐标 x 的值从小到大排序。
 * 也就是说 points[i] = [xi, yi] ，并且在 1 <= i < j <= points.length 的前提下， xi < xj 总成立。
 * 请你找出 yi + yj + |xi - xj| 的 最大值，其中 |xi - xj| <= k 且 1 <= i < j <= points.length。
 * 题目测试数据保证至少存在一对能够满足 |xi - xj| <= k 的点。
 *
 *
 * @Author: Take-off
 * @Date: 1:00 PM 2023/6/
 * @Param:
 * @return:
 **/
public class Solution0811 {

    //满足不等式的最大值
    public int findMaxValueOfEquation(int[][] points, int k) {
        int ans = Integer.MIN_VALUE;
        ArrayDeque<int[]> q = new ArrayDeque<>();
        for (int[] p : points) {
            int x = p[0], y = p[1];
            while (!q.isEmpty() && q.peekFirst()[0] < x - k) // 队首超出范围
                q.pollFirst(); // 弹它！
            if (!q.isEmpty())
                ans = Math.max(ans, x + y + q.peekFirst()[1]); // 加上最大的 yi-xi
            while (!q.isEmpty() && q.peekLast()[1] <= y - x) // 队尾不如新来的强
                q.pollLast(); // 弹它！
            q.addLast(new int[]{x, y - x});
        }
        return ans;

    }

    //整数的各位积和之差
    public int diagonalSum(int[][] mat) {
        int count = 0;
        int length = mat.length;
        //相同列的 i + j
        for (int i =0;i< length;i++){
            count  += mat[i][i] + mat[i][length - i - 1];
        }
        //减去交叉
        if (length%2 == 1){
            count -= mat[length/2][length/2];
        }
        return count;
    }

}
